package cn.youqu.happy.module.youqu.service.userJoinActivity;

import cn.youqu.happy.framework.common.pojo.PageResult;
import cn.youqu.happy.module.youqu.controller.admin.userJoinActivity.vo.UserJoinActivityCreateReqVO;
import cn.youqu.happy.module.youqu.controller.admin.userJoinActivity.vo.UserJoinActivityExportReqVO;
import cn.youqu.happy.module.youqu.controller.admin.userJoinActivity.vo.UserJoinActivityPageReqVO;
import cn.youqu.happy.module.youqu.controller.admin.userJoinActivity.vo.UserJoinActivityUpdateReqVO;
import cn.youqu.happy.module.youqu.dal.dataobject.userJoinActivity.UserJoinActivityDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 用户加入活动 Service 接口
 * 此表避免用户并发导致加入活动失败
 *
 * @author 王其岩 20112001045
 */
public interface UserJoinActivityService {

    /**
     * 创建用户加入活动
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Integer createUserJoinActivity(@Valid UserJoinActivityCreateReqVO createReqVO);

    /**
     * 更新用户加入活动
     *
     * @param updateReqVO 更新信息
     */
    void updateUserJoinActivity(@Valid UserJoinActivityUpdateReqVO updateReqVO);

    /**
     * 删除用户加入活动
     *
     * @param id 编号
     */
    void deleteUserJoinActivity(Integer id);

    /**
     * 获得用户加入活动
     *
     * @param id 编号
     * @return 用户加入活动
     */
    UserJoinActivityDO getUserJoinActivity(Integer id);

    UserJoinActivityDO getUserJoinActivity(Integer activityId, Long hostUid, Long uid);


    /**
     * 获得用户加入活动列表
     *
     * @param ids 编号
     * @return 用户加入活动列表
     */
    List<UserJoinActivityDO> getUserJoinActivityList(Collection<Integer> ids);

    /**
     * 获得用户加入活动分页
     *
     * @param pageReqVO 分页查询
     * @return 用户加入活动分页
     */
    PageResult<UserJoinActivityDO> getUserJoinActivityPage(UserJoinActivityPageReqVO pageReqVO);

    /**
     * 获得用户加入活动列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 用户加入活动列表
     */
    List<UserJoinActivityDO> getUserJoinActivityList(UserJoinActivityExportReqVO exportReqVO);

    /**
     * 加入用户活动
     *
     * @param activityId 用户活动id
     * @param hostUid    用户活动发起人
     * @param uid        当前用户
     * @return 数据表id
     */
    Integer joinUserActivity(Integer activityId, Long hostUid, Long uid);

    /**
     * 用户退出活动组队
     *
     * @param activityId 用户活动id
     * @param hostUid    用户活动发起人
     * @param uid        当前用户
     * @return 是否退出成功
     */
    boolean quitUserActivity(Integer activityId, Long hostUid, Long uid);

    /**
     * 获取加入活动的全部用户
     *
     * @param activityId 用户活动id
     * @param hostUid    用户活动发起人
     * @return 加入人数组
     */
    List<Long> getUserActivityPartners(Integer activityId, Long hostUid);
}
